Problema de Regresión
Caso de estudio, instituciones educativas y numero de estudiantes
Importamos CSV
Code
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# Cargar datos
df = pd.read_csv('estudios.csv' , sep= ';' , quotechar= '"' , encoding= 'utf-8' , engine= 'python' )
# Preprocesamiento
df['Anio' ] = df['Anio_lectivo' ].str .extract(r' ( \d {4} ) ' ).astype(int )
df = pd.get_dummies(df, columns= ['Sostenimiento' , 'Area' , 'Regimen_Escolar' ])
Code
df.head()
list (df.columns)
df.drop(columns= ['Anio_lectivo' , 'Zona' ,'Nombre_Institucion' ], inplace= True )
#list(df.columns)
Code
df.head()
list (df.columns)
['Provincia',
'Cod_Provincia',
'Canton',
'Cod_Canton',
'Parroquia',
'Cod_Parroquia',
'AMIE',
'Tipo_Educacion',
'Jurisdiccion',
'Docentes_Femenino',
'Docentes_Masculino',
'Total_Docentes',
'Estudiantes_Femenino',
'Estudiantes_Masculino',
'Total_Estudiantes',
'Ecuatoriana',
'Colombiana',
'Venezolana',
'Peruana',
'Otros_Paises_de_America',
'Otros_Continentes',
'Anio',
'Sostenimiento_Fiscal',
'Sostenimiento_Fiscomisional',
'Sostenimiento_Municipal',
'Sostenimiento_Particular',
'Area_Rural',
'Area_Urbana',
'Regimen_Escolar_Costa',
'Regimen_Escolar_Sierra']
EDA
Simplemente se arreglaran datos, eliminacion de datos faltantes
Code
# Variables
X = df[['Anio' , 'Total_Docentes' , 'Sostenimiento_Fiscal' , 'Area_Rural' ]] # por ejemplo
y = df['Total_Estudiantes' ]
# Modelo
Split, Pipeline y fit
Usaremos el train split para dividir el conjunto de datos
luego crearemos el pipeline con el escalado y la funcion de Regresion lineal, y luego usaremos fit del pipeline con los datos separados
Code
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error
import altair as alt
from sklearn.metrics import mean_squared_error, r2_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
pipe = Pipeline([
("escalado" , StandardScaler()),
("lineal" , LinearRegression())
])
# 7. Entrenar
pipe.fit(X_train, y_train)
# 8. Predecir
y_pred_pipe = pipe.predict(X_test)
### Evaluacion Probaremos este modelo con estas 3 valores de evaluacion
Code
rmse = mean_squared_error(y_test, y_pred_pipe)** 0.5
r2 = r2_score(y_test, y_pred_pipe)
print ("RMSE:" , rmse)
mae = mean_absolute_error(y_test, y_pred_pipe)
print ("Mae:" , mae)
print ("R²:" , r2)
RMSE: 169.49257558489097
Mae: 73.31884183792116
R²: 0.8184550851844328
Graficos
Aqui realizaremos algunos graficos de este modelo para poder aprenciar el trabajo, y como esta funcionando el modelo a comparacion de la realidad
Code
import numpy as np
alt.data_transformers.disable_max_rows()
df_vp = pd.DataFrame({
'Valores_Reales' : y_test,
'Predicciones' : y_pred_pipe
})
# Gráfico scatter plot: Valores reales vs predicciones
scatter = alt.Chart(df_vp).mark_circle(size= 60 , opacity= 0.6 ).encode(
x= 'Valores_Reales' ,
y= 'Predicciones' ,
tooltip= ['Valores_Reales' , 'Predicciones' ]
)
alt.Chart(df_vp).mark_circle(size= 60 , opacity= 0.6 ).encode(
x= 'Valores_Reales' ,
y= 'Predicciones' ,
tooltip= ['Valores_Reales' , 'Predicciones' ]
)
line = alt.Chart(pd.DataFrame({
'x' : [df_vp['Valores_Reales' ].min (), df_vp['Valores_Reales' ].max ()]
})).mark_line(color= 'red' ).encode(
x= 'x' ,
y= 'x'
)
alt.Chart(pd.DataFrame({
'x' : [df_vp['Valores_Reales' ].min (), df_vp['Valores_Reales' ].max ()]
})).mark_line(color= 'red' ).encode(
x= 'x' ,
y= 'x'
)
scatter_plot = (scatter + line).properties(
width= 600 ,
height= 400 ,
title= 'Predicciones vs Valores Reales'
)
scatter | line | scatter_plot
# Gráfico histograma de errores
df_errores = pd.DataFrame({'Error' : df_vp['Valores_Reales' ] - df_vp['Predicciones' ]})
histograma = alt.Chart(df_errores).mark_bar().encode(
alt.X('Error' , bin = alt.Bin(maxbins= 30 )),
y= 'count()'
).properties(
width= 600 ,
height= 300 ,
title= 'Distribución de Errores'
)
Resultados
El modelo explica bin la varianza de los datos, Los datos de RMSE indican valores bajos entre las predicciones y valores reales, lo que se puede apreciar los graficos especialmente en el scatter plot